/**
 * Kelas Latar
 * @class Latar
 * @file Latar.h
 * @author Christianto
 * @date 8 Maret 2012
 */

#ifndef _LATAR_H
#define _LATAR_H

#include<iostream>
#include "../Bidang/Bidang.h"

using namespace std;

class Latar {
    private:
        int Row,Col;
        Bidang** Gambar;
        int MaxSize, NBidang;
        Sel* Kertas;        
    
    public:
		/**
		 * Konstruktor dari kelas latar. (default (row*column = 20*40))
         * @param M Baris
         * @param N Kolom
         */
        Latar(int M = 20, int N = 40);
		
		/**
		 * Copy Konstruktor dari kelas latar.
         * @param L Latar original
         */
        Latar(const Latar& L);
		
        /**
		 * Assignment operator dari kelas latar.
		 *
         * @param L Latar original
         * @return reference ke latar
         */
        Latar& operator=(const Latar& L);
        
		/**
		 * Destruktor dari kelas latar
         */
        ~Latar();
		
		
		//Getter
		
		/**
		 * Mengembalikan jumlah baris suatu latar
         * @return jumlah baris
         */
        int GetRow() const;
		
		/**
		 * Mengembalikan jumlah kolom suatu latar
         * @return jumlah kolom
         */
        int GetCol() const;
		
		/**
		 * Mengembalikan jumlah bidang dalam latar
         * @return jumlah bidang dalam latar
         */
        int GetNOBidang() const;
        
        //Predicate
        
		/**
		 * Mengembalikan true jika Bidang ada dalam Latar
         * @param B Suatu Bidang
         * @return Bidang ada dalam Latar
         */
        bool IsBidangIn(const Bidang* B);
        
        /**
         * Mengembalikan true jika Point P terletak di dalam batas Latar
         * @param P Suatu Point
         * @return Point P terletak di dalam batas Latar
         * 
         */
        bool IsPointIn(const Point P);
        
        //Main operation
        
        /**
        * I.S. : Bidang* terdefinisi dan menunjuk ke bidang yang sah
        * F.S. : Isi Gambar bertambah satu  
        * @param B Suatu Bidang
        */
        void AddBidang(Bidang* B);
        
        /**
        * I.S. : Bidang* terdefinisi, menunjuk ke bidang yang sah
        * F.S. : Gambar berkurang satu isinya bila awalnya ada.
        * @param B Suatu Bidang
        */
        void DelBidang(const Bidang* B);
        
        /**
        * Menghapus semua isi Kertas dan mengisinya dengan character tertentu
        * @param a suatu character 
        */
        void CleanPaper(char a = '.');
		
        /**
        * I.S. : sembarang
        * F.S. : Latar sudah kosong, tidak ada bidang yang ditunjuk
        */
        void ClearAll();
        
        /**
        * I.S. : Latar terdefinisi
        * F.S. : Latar belakang sudah terisi data terbaru
        */
        void Draw(char = '.');            
        
        /**    
        * I.S. : Latar Terdefinisi
        * F.S. : Latar belakang tertulis di layar
        */
        void ShowLatar();
		
        /**
         * Menghitung perbandingan karakter non kosong dengan karakter blank
         * Diasumsikan latar sudah diperbaharui dengan data terbaru
         * @return perbandingan karakter non kosong dengan karakter blank
         */
        void ComputeC();      
        
        /**
         * Menghitung perbandingan karakter non kosong dengan total karakter latar
         * Diasumsikan latar sudah diperbaharui dengan data terbaru
         * @return perbandingan karakter non kosong dengan total karakter latar
         */
        void ComputeS();      
        //
        
        /**
         * Output Stream dari kelas Latar
         */
        friend ostream& operator<< (ostream& stream, const Latar& L);
};

#endif

